#include <stdio.h>

/**
 * @brief 分区函数，选择一个基准元素并将数组分区
 * @param arr 待排序数组
 * @param low 分区开始索引
 * @param high 分区结束索引
 * @return 分区后基准元素的最终位置
 */
int partition(int arr[], int low, int high)
{
  int pivot = arr[high];
  int i = low - 1;

  for (int j = low; j < high; j++)
  {
    if (arr[j] < pivot)
    {
      i++;
      int temp = arr[i];
      arr[i] = arr[j];
      arr[j] = temp;
    }
  }
  int temp = arr[i + 1];
  arr[i + 1] = arr[high];
  arr[high] = temp;
  return i + 1;
}

/**
 * @brief 快速排序函数，时间复杂度O(n log n)，空间复杂度O(log n)，适合大规模数据排序
 * @param arr 待排序数组
 * @param low 排序范围的开始索引
 * @param high 排序范围的结束索引
 */
void quickSort(int arr[], int low, int high)
{
  if (low < high)
  {
    int pivot = partition(arr, low, high);
    quickSort(arr, low, pivot - 1);
    quickSort(arr, pivot + 1, high);
  }
}

int main()
{
  int arr[] = {64, 34, 25, 12, 22, 11, 90};
  int n = sizeof(arr) / sizeof(arr[0]);
  quickSort(arr, 0, n - 1);
  printf("Sorted array: \n");
  for (int i = 0; i < n; i++)
    printf("%d ", arr[i]);
  return 0;
}